/// <summary>
/// The base class for chunk renderers.
/// </summary>
class IChunkRenderData
{
public:
	/// <summary>
	/// Translate the view matrix.
	/// </summary>
	/// <param name="x">X value.</param>
	/// <param name="y">Y value.</param>
	/// <param name="z">Z value.</param>
	void Translate(const float &x, const float &y, const float &z);

	/// <summary>
	/// Rotate the view matrix.
	/// </summary>
	/// <param name="angle">Angle in degrees.</param>
	/// <param name="axisX">Whether the X axis is rotated or not.</param>
	/// <param name="axisY">Whether the Y axis is rotated or not.</param>
	/// <param name="axisZ">Whether the Z axis is rotated or not.</param>
	void Rotate(const float &angle, const int &axisX, const int &axisY, const int &axisZ);

	/// <summary>
	/// Scale the view matrix.
	/// </summary>
	/// <param name="x">X scale.</param>
	/// <param name="y">Y scale.</param>
	/// <param name="z">Z scale.</param>
	void Scale(const float &x, const float &y, const float &z);

	/// <summary>
	/// Save the current matrix state.
	/// </summary>
	void PushState();

	/// <summary>
	/// Restore matching pushed matrix state.
	/// </summary>
	void PopState();
	
	/// <summary>
	/// Draw a box at a location.
	/// </summary>
	/// <param name="box">Box to draw.</param>
	void Draw(const Box &box);

	/// <summary>
	/// Draw a face at a location.
	/// </summary>
	/// <param name="face">Face to draw.</param>
	/// <param name="reverse">Draw both the front and back faces if true, else only draw front.</param>
	void Draw(const Face &face, const bool &reverse = false);

	/// <summary>
	/// Passes execution of a renderer to another block. You can use this to "forward" renders to different IDs.
	/// </summary>
	/// <param name="schematic">The current schematic being rendered.</param>
	/// <param name="block">The block to render.</param>
	/// <param name="position">The position of the block.</param>
	void ExecuteRenderer(Schematic *schematic, const Block &block, const Point3i &position);
};